跳到主要内容

grpcurl 工具请求 gRPC

grpcurl 是一个与 grpc 服务器交互的命令行工具,可认为是 gRPC 的 curl 工具。

因为 gRPC 使用二进制编码(protobuf), 所以不能利用常规的 curl 工具(早期的 curl 版本还不支持 HTTP/2)。grpcurl 用于从命令行调用 gRPC 服务器支持的 RPC 方法

安装

go get github.com/fullstorydev/grpcurl
go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest

grpcurl 工具接受 json 编码的消息, 工具底层会转化为 protobuf 与服务器交互。

grpcurl 通过三种方式之一实现此目的。

  • gRPC 服务器添加 gRPC 反射
  • 直接读取 proto 源文件
  • 加载编译后的 protoset文件(包含已被编码的proto描述文件)

使用 gRPC 反射的原理

gRPC 提供了 grpc.reflection.v1alpha.ServerReflection 服务,在 Server 端添加后可以通过该服务获取所有服务的信息,包括服务定义,方法,属性等;

可以根据获取到的服务信息调用其他的方法,实现泛化调用

// 实例化 grpc Server
s := grpc.NewServer()

// 注册 HelloService
pb.RegisterHelloServer(s, helloService)

// 注册反射服务
reflection.Register(s)

在使用 grpcurl 时,需要通过 -cert 和 -key 参数设置公钥和私钥文件,表示链接启用了 TLS 协议的服务。对于没有启用 TLS 协议的 gRPC 服务,通过 -plaintext 参数忽略 TLS 证书的验证过程。

如果是 Unix Socket 协议,则需要指定 -unix 参数。

使用例:

$ grpcurl -plaintext localhost:50052 list
# output
grpc.reflection.v1alpha.ServerReflection
hello.Hello

查看更详细的细节:

$ grpcurl -plaintext  localhost:8888 describe proto.HelloService
# output
proto.HelloService is a service:
service HelloService {
rpc Channel ( stream .proto.String ) returns ( stream .proto.String );
rpc Hello ( .proto.String ) returns ( .proto.String );
}

获取类型信息:

$ grpcurl -plaintext  localhost:8888 describe proto.String
proto.String is a message:
message String {
string value = 1;
}

调用服务方法:

$ grpcurl -plaintext -d '{"value":"grpcurl"}' localhost:8888 proto.HelloService/Hello
{
"value": "hello grpc"
}

References

使用 grpcurl 通过命令行访问 gRPC 服务 gRPC 反射服务 grpc命令行工具grpcurl使用 gRPC 客户端长连接机制实现及 keepalive 分析